package com.huyi.common.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

/**
 * 中文基本汉字校验
 * <p>字数：20902字</p>
 * <p>UNICODE编码：4E00-9FA5</p>
 * 
 * 说明见下文：
 * <p>https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php
 * 
 * @author shengli.hu
 */
public class ChineseCharacterUtil {
	
	// 空格换行符等正则表达式
	private static String REGEX_BLANK = "\\s*|\t|\r|\n";
	
	// 汉字UNICODE正则表达式
	private static String REGEX = "[\\u4e00-\\u9fa5]{2,30}";
	
	// 少数民族点号
	private static String SYMBOL_POINT = "·";

	/**
	 * 汉字姓名校验
	 * 
	 * @param name
	 * @return
	 */
	public static boolean regEx(String name) {
		try {
			if(StringUtils.isEmpty(name)) {
				return false;
			}

			// 过滤各种空格、换行符等
			String newName = name.trim();
			Pattern p = Pattern.compile(REGEX_BLANK);
			Matcher m = p.matcher(newName);
			newName = m.replaceAll("");
			if(StringUtils.isEmpty(newName)) {
				return false;
			}

			// 少数民族点号去除并且匹配汉字Unicode值
			newName = StringUtils.replace(newName, SYMBOL_POINT, "");
			Pattern pattern = Pattern.compile(REGEX);
			Matcher matcher = pattern.matcher(newName);
			return matcher.matches();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 汉字姓名校验,成功后返回正确汉字
	 * 
	 * @param name
	 * @return
	 * 	<p>校验成功</p>：正确汉字
	 * 	<p>校验失败</p>：返回空值
	 * 
	 */
	public static String getRegExName(String name) {
		String ret = "";
		try {
			if(StringUtils.isEmpty(name)) {
				return ret;
			}
			
			// 过滤各种空格、换行符等
			String newName = name.trim();
			Pattern p = Pattern.compile(REGEX_BLANK);
			Matcher m = p.matcher(newName);
			newName = m.replaceAll("");
			if(StringUtils.isEmpty(newName)) {
				return ret;
			}

			// 判断是否有点号
			if(newName.indexOf(SYMBOL_POINT) > 0) {
				// 匹配汉字Unicode值
				String matchStr = StringUtils.replace(newName, SYMBOL_POINT, "");
				Pattern pattern = Pattern.compile(REGEX);
				Matcher matcher = pattern.matcher(matchStr);
				if(matcher.matches() ) {
					ret = newName;
				}
			} else {
				// 匹配汉字Unicode值
				Pattern pattern = Pattern.compile(REGEX);
				Matcher matcher = pattern.matcher(newName);
				if(matcher.matches() ) {
					ret = newName;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * Test
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(ChineseCharacterUtil.regEx("\t"));
		System.out.println(ChineseCharacterUtil.regEx("胡"));
		
		System.out.println("-------------含点号--------------------------");
		System.out.println(ChineseCharacterUtil.regEx("买丽比亚·艾沙江"));
		System.out.println(ChineseCharacterUtil.regEx("厂賁辩·鳖曲辩辩露逞圈圈"));
		System.out.println(ChineseCharacterUtil.regEx("辩皤辩鼹辩翩髋·翻翻辩湖辩翻辩翩鞲出赣陬辩"));
		System.out.println(ChineseCharacterUtil.getRegExName("辩皤辩鼹辩翩髋·翻翻辩湖辩翻辩翩鞲出赣陬辩"));
		System.out.println(ChineseCharacterUtil.regEx("露翾二三辩·布暨翻霭辩嚣鳖繇辩逞辩雷二辩羹町翻霸匡"));
		
		// 乱码
		System.out.println("-------------乱码--------------------------");
		System.out.println(ChineseCharacterUtil.regEx("ç­ä¿¡å¹³å°åéç­ä¿¡æ¥å£"));
		System.out.println(ChineseCharacterUtil.regEx("ä¸è½½"));
		// 特殊汉字
		System.out.println(ChineseCharacterUtil.regEx("龫龬龭龮龯龰龱龲"));
	}
}
